#!/usr/bin/env python3
"""
Android API 辅助库 - 使用TCP Socket直接通信（最直接高效）

这是一个完全独立的实现，直接通过TCP Socket与Android端通信。
不需要广播，不需要文件系统，直接双向通信。

使用方法:
    from android_api_tcp import AndroidAPITCP
    
    api = AndroidAPITCP()
    result = api.call_android("get_device_info")
    if result['status'] == 'success':
        print(result['data'])
    
    # 带参数调用
    result = api.call_android("calculate", data="10+5")
    print(result['data'])  # 输出: 15.0
"""

import socket
import json
import os


class AndroidAPITCP:
    """使用TCP Socket直接调用Android API"""
    
    # 默认端口
    DEFAULT_PORT = 12345
    
    # 默认主机（本地）
    DEFAULT_HOST = "127.0.0.1"
    
    def __init__(self, host=None, port=None, timeout=5.0):
        """
        初始化Android API客户端
        
        Args:
            host: 服务器主机地址，默认 "127.0.0.1"
            port: 服务器端口，默认 12345，可通过环境变量 PYTHON_API_SOCKET_PORT 配置
            timeout: 连接和读取超时时间（秒）
        """
        self.host = host or self.DEFAULT_HOST
        
        # 从环境变量获取端口，如果没有则使用默认值
        if port is None:
            port_str = os.getenv("PYTHON_API_SOCKET_PORT")
            if port_str:
                try:
                    self.port = int(port_str)
                except ValueError:
                    self.port = self.DEFAULT_PORT
            else:
                self.port = self.DEFAULT_PORT
        else:
            self.port = port
        
        self.timeout = timeout
    
    def _send_request(self, request_data):
        """
        通过TCP Socket发送请求并接收响应
        
        Args:
            request_data: 请求数据字典
            
        Returns:
            dict: 响应数据字典，包含status和data
        """
        try:
            # 创建TCP Socket连接
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.settimeout(self.timeout)
            
            # 连接到服务器
            sock.connect((self.host, self.port))
            
            # 将请求转换为JSON字符串
            request_json = json.dumps(request_data, ensure_ascii=False)
            
            # 发送请求（添加换行符作为结束标记）
            sock.sendall((request_json + "\n\n").encode('utf-8'))
            
            # 接收响应
            response_data = b""
            while True:
                chunk = sock.recv(4096)
                if not chunk:
                    break
                response_data += chunk
                # 简单的结束判断：如果收到空行或数据足够
                if b"\n" in chunk and len(response_data) > 0:
                    break
            
            sock.close()
            
            # 解析响应JSON
            response_str = response_data.decode('utf-8', errors='ignore').strip()
            if not response_str:
                return {"status": "error", "data": "收到空响应"}
            
            # 尝试解析JSON（可能有多行）
            lines = response_str.split('\n')
            for line in lines:
                line = line.strip()
                if line and line.startswith('{'):
                    try:
                        return json.loads(line)
                    except json.JSONDecodeError:
                        continue
            
            # 如果所有行都无法解析，返回错误
            return {"status": "error", "data": f"无法解析响应: {response_str}"}
            
        except socket.timeout:
            return {"status": "error", "data": "连接超时"}
        except ConnectionRefusedError:
            return {
                "status": "error",
                "data": f"连接被拒绝: 服务器可能未运行 (host={self.host}, port={self.port})"
            }
        except socket.gaierror:
            return {"status": "error", "data": f"无法解析主机地址: {self.host}"}
        except Exception as e:
            return {"status": "error", "data": f"Socket通信错误: {str(e)}"}
    
    def call_android(self, action, message=None, title=None, data=None):
        """
        调用Android代码
        
        Args:
            action: 要执行的操作（如 "show_toast", "get_device_info", "calculate" 等）
            message: 消息内容（可选）
            title: 标题（可选）
            data: 数据内容（可选）
            
        Returns:
            dict: 包含status和data的字典
        """
        # 构建请求数据
        request_data = {"action": action}
        
        if message is not None:
            request_data["message"] = message
        if title is not None:
            request_data["title"] = title
        if data is not None:
            request_data["data"] = data
        
        # 发送请求并返回响应
        return self._send_request(request_data)
    
    def show_toast(self, message):
        """
        显示Toast消息
        
        Args:
            message: 要显示的消息
            
        Returns:
            dict: 包含status和data的字典
        """
        return self.call_android("show_toast", message=message)
    
    def show_notification(self, title, message):
        """
        显示通知
        
        Args:
            title: 通知标题
            message: 通知内容
            
        Returns:
            dict: 包含status和data的字典
        """
        return self.call_android("notification", title=title, message=message)
    
    def get_device_info(self):
        """
        获取设备信息
        
        Returns:
            dict: 包含status和data的字典，data中包含设备信息字符串
        """
        return self.call_android("get_device_info")
    
    def calculate(self, expression):
        """
        执行计算（示例）
        
        Args:
            expression: 计算表达式，如 "10+5", "20-3", "6*7", "100/4"
            
        Returns:
            dict: 包含status和data的字典，data中包含计算结果
        """
        return self.call_android("calculate", data=expression)


# 便捷函数
def call_android(action, **kwargs):
    """
    便捷函数：调用Android代码
    
    Args:
        action: 要执行的操作
        **kwargs: 其他参数（message, title, data）
        
    Returns:
        结果字典
    """
    api = AndroidAPITCP()
    return api.call_android(action, **kwargs)


if __name__ == "__main__":
    # 测试代码
    print("=" * 60)
    print("Android API TCP Socket 测试")
    print("=" * 60)
    
    api = AndroidAPITCP()
    
    print(f"\n连接到: {api.host}:{api.port}")
    print("提示: 确保PythonApiSocketService已启动")
    
    # 测试1: 获取设备信息
    print("\n1. 测试获取设备信息...")
    result = api.get_device_info()
    if result and result.get('status') == 'success':
        print("✓ 成功获取设备信息:")
        print(result.get('data', ''))
    else:
        print(f"✗ 失败: {result}")
        if result and '连接被拒绝' in result.get('data', ''):
            print("\n提示: 请确保PythonApiSocketService已启动")
            print("可以通过以下方式启动:")
            print("  am startservice -n com.termux/.app.api.PythonApiSocketService")
    
    # 测试2: 执行计算
    print("\n2. 测试执行计算...")
    result = api.calculate("10+5")
    if result and result.get('status') == 'success':
        print(f"✓ 计算结果: 10+5 = {result.get('data', '')}")
    else:
        print(f"✗ 失败: {result}")
    
    result = api.calculate("20*3")
    if result and result.get('status') == 'success':
        print(f"✓ 计算结果: 20*3 = {result.get('data', '')}")
    
    # 测试3: 显示Toast
    print("\n3. 测试显示Toast...")
    result = api.show_toast("来自TCP Socket的测试消息")
    if result and result.get('status') == 'success':
        print(f"✓ {result.get('data', '')}")
    else:
        print(f"✗ 失败: {result}")
    
    # 测试4: 显示通知
    print("\n4. 测试显示通知...")
    result = api.show_notification("TCP Socket测试", "这是一条测试通知")
    if result and result.get('status') == 'success':
        print(f"✓ {result.get('data', '')}")
    
    print("\n" + "=" * 60)
    print("测试完成！")
    print("=" * 60)

    print("\n按 Enter 键退出...")
    try:
        input()
    except (EOFError, KeyboardInterrupt):
        pass

